package util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import javax.swing.JOptionPane;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import com.db.bean.President;

public abstract class BaseDAO<T> {
	private Class<T> clazz  = null;
	// 获取子类继承父类的泛型
	{
		// this.获取自己这个类().带泛型的父类();
		Type type = this.getClass().getGenericSuperclass();
		// 上面获取成功后，这里把type转为带参数的type
		ParameterizedType ptt = (ParameterizedType) type;
		// 这样才能获取到泛型集合
		Type[] typeArguments = ptt.getActualTypeArguments();
		// 最后取到泛型里面的具体类型
		clazz  = (Class<T>) typeArguments[0];
	}


	/**
	 * @description 返回一个查询对象 支持事务
	 * @version 创建时间：2020年4月25日 下午7:52:19
	 * @param clazz 
	 * @param sql
	 * @param args
	 * @return
	 */
	public <T>T query(Connection conn, String sql, Object... args) {
		try {
			QueryRunner dao = new QueryRunner();
			BeanHandler<T> handler = new BeanHandler<>(getCs());//定义查询返回的数据类型
			T query = (T) dao.query(conn, sql,  handler, args);
			return query; //返回查询结果 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
		}
		return null;
	}
	/**
	 * 
	 * @version 创建时间：2020年4月28日 下午8:29:05
	 * @description  返回一个查询对象 不支持事务
	 * @param sql
	 * @param args
	 * @return
	 */
	public  <T>T query(String sql, Object... args) {
		Connection conn=null;
		try {
			conn = JDBCUtiles.getConnection();
			QueryRunner dao = new QueryRunner();
			BeanHandler<T> handler = new BeanHandler<>(getCs());//定义查询返回的数据类型
			T query = (T) dao.query(conn, sql,  handler, args);
			return query; //返回查询结果 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtiles.closeResource(conn);
		}
		return null;
	}
	/**
	 * 
	 * @version 创建时间：2020年4月28日 下午8:24:33
	 * @description  返回查询列表 支持事务
	 * @param conn
	 * @param sql
	 * @param args
	 * @return
	 */
	//     List<T> 这样写对吗
	public List<T> queryList(Connection conn, String sql, Object... args) {
		try {
			QueryRunner dao = new QueryRunner();
			BeanListHandler<T> handler = new BeanListHandler<>(getCs());//定义查询返回的数据类型
			List<T> query = (List<T>) dao.query(conn, sql,  handler, args);
			return query; //返回查询结果 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
		}
		return null;
	}
	/**
	 * 
	 * @version 创建时间：2020年4月28日 下午8:31:12
	 * @description  返回查询列表 不支持事务 
	 * @param sql
	 * @param args
	 * @return
	 */
	public List<T> queryList(String sql, Object... args) {
		Connection conn = null;
		try {
			conn = JDBCUtiles.getConnection();
			QueryRunner dao = new QueryRunner();
			BeanListHandler<T> handler = new BeanListHandler<>(getCs());//定义查询返回的数据类型
			List<T> query = (List<T>) dao.query(conn, sql,  handler, args);
			return query; //返回查询结果 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtiles.closeResource(conn);
		}
		return null;
	}
	

	/**
	 * @description 更新语句 支持事务
	 * @version 创建时间：2020年4月26日 下午3:20:38
	 */
	public int update(Connection conn, String sql, Object... args) {
		try {
			QueryRunner dao = new QueryRunner();
			int i = dao.update(conn, sql,args);
			return i;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}
	
	/**
	 * @description 更新语句 不支持事务
	 * @version 创建时间：2020年4月26日 下午3:20:38
	 */
	public int update(String sql, Object... args) {
		Connection conn = null;
		try {
			conn = JDBCUtiles.getConnection();
			QueryRunner dao = new QueryRunner();
			int i = dao.update(conn, sql,args);
			return i;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtiles.closeResource(conn);
		}
		return 0;
	}

	/**
	 * 
	 * @version 创建时间：2020年4月28日 下午8:51:34
	 * @description  获取查询结果为一个字段
	 * @param sql
	 * @param args
	 * @return
	 */
	public <E> E getValue(String sql, Object... args) {
		Connection conn = null;
		try {
			QueryRunner dao = new QueryRunner();
			conn = JDBCUtiles.getConnection();
//			String sql = "select count(*) from user";
			ScalarHandler handler = new ScalarHandler();
			Object query = dao.query(conn, sql, handler,args);
			return (E) query;
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtiles.closeResource(conn);
		}
		return null;
	}
	/**
	 * 
	 * @version 创建时间：2020年4月28日 下午8:56:15
	 * @description  获取查询结果为一个字段 支持事务
	 * @param conn
	 * @param sql
	 * @param args
	 * @return
	 */
	public <E> E getValue(Connection conn,String sql, Object... args) {
		try {
			QueryRunner dao = new QueryRunner();
			ScalarHandler handler = new ScalarHandler();
			Object query = dao.query(conn, sql, handler,args);
			return (E) query;
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return null;
	}
	private Class getCs() {
		T t= null;
		try {
			t = clazz.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return (Class) t.getClass();
	}
}